package com.qch.handler;

import com.alibaba.fastjson.JSON;
import com.qch.json.JSONSerializer;
import com.qch.json.RpcEncoder;
import com.qch.json.RpcRequest;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

import java.util.concurrent.Callable;

/**
 * @Author qch
 * @Date 2021/1/28
 * 自定义事件处理器
 *
 * 步骤
 * //1.定义成员变量
 *   2.实现ChannelActive 客户端和服务端连接时，该方法自动执行
 *   3.实现channelRead 当我们堆到服务器数据，该方法自动执行
 *   4.将客户端的数据写到服务器
 *   5.设置参数方法
 */
public class UserClientHandler extends ChannelInboundHandlerAdapter implements Callable {
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        super.exceptionCaught(ctx, cause);
        System.out.println(cause.getMessage());
    }

    //1.定义成员变量
    private ChannelHandlerContext context;//事件处理器上下文对象（存储handler信息，写操作）
    private String result;//记录服务器返回的数据
    private Object param ;//记录将要发送给服务器的数据
    private RpcRequest rpcRequest ;//记录将要发送给服务器的数据
    //2.实现ChannelActive 客户端和服务端连接时，该方法自动执行

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        //初始化ChannelHandlerContext
        this.context=ctx;
    }

    //3.实现channelRead 当我们堆到服务器数据，该方法自动执行

    @Override
    public synchronized void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        //将读到的结果数据msg，设置为成员变量的值
        System.out.println(JSON.toJSONString(msg));
        result=msg.toString();
        //关键-》写然后通知读
        notify();
    }

    //4.将客户端的数据写到服务器

    /**
     * 多线程相关
     * @return
     * @throws Exception
     */
    public synchronized Object call() throws Exception {
        context.writeAndFlush(param);
       /* RpcEncoder rpcEncoder = new RpcEncoder(RpcRequest.class, new JSONSerializer());
        byte[] bytes = serializer.serialize(msg);*/
        wait();
        return  result;
    }
    //5.设置参数方法
    public void setParam(RpcRequest rpcRequest) {
        this.param = rpcRequest;
    }
  /*  public void setParam(RpcRequest rpcRequest) {
        this.rpcRequest = rpcRequest;
    }*/
}
